home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / pmode / pmode30b / c0pm.asm < prev    next >
Assembly Source File  |  1994-05-31  |  5KB  |  178 lines

  1. ; Quickie startup code to interface PMODE v3.0 with Borland C++ 4.0 for Win32.
  2. ; By Tran (a.k.a. Thomas Pytel).
  3.  
  4. .386p
  5. locals
  6.  
  7. STACKLEN    = 4000h         ; size of stack in bytes
  8.  
  9. PMODE_TEXT      segment para public use16 'CODE'
  10. PMODE_TEXT      ends
  11. _TEXT           segment byte public use32 'CODE'
  12. _TEXT           ends
  13. _DATA           segment dword public use32 'DATA'
  14. _DATA           ends
  15. _BSS            segment dword public use32 'BSS'
  16. _BSS            ends
  17. EXE_STACK       segment para stack use16 'STACK'
  18. EXE_STACK       ends
  19.  
  20. DGROUP          group   _DATA, _BSS
  21. assume  cs:_TEXT, ds:DGROUP
  22.  
  23. extrn   _pm_info:far, _pm_init:far
  24.  
  25. PMODE_TEXT      segment para public use16 'CODE'
  26. assume  cs:PMODE_TEXT, ds:PMODE_TEXT
  27.  
  28. ;═════════════════════════════════════════════════════════════════════════════
  29. align 2
  30. errmsgtbl       dw      errmsg0,errmsg1,errmsg2,errmsg3
  31.                 dw      errmsg4,errmsg5,errmsg6
  32.  
  33. errmsg0         db      'Not enough low memory!',13,10,36
  34. errmsg1         db      '80386 or better not detected!',13,10,36
  35. errmsg2         db      'System already in protected mode and no VCPI or DPMI found!',13,10,36
  36. errmsg3         db      'DPMI host is not 32bit!',13,10,36
  37. errmsg4         db      'Could not enable A20 gate!',13,10,36
  38. errmsg5         db      'Could not enter DPMI 32bit protected mode!',13,10,36
  39. errmsg6         db      'Could not allocate needed DPMI selectors!',13,10,36
  40.  
  41. ;═════════════════════════════════════════════════════════════════════════════
  42. start:
  43.     push cs             ; DS = CS
  44.         pop ds
  45.  
  46.     call _pm_info            ; get information
  47.     jnc short @@startf0        ; if no error, go on
  48.  
  49. @@startf1:
  50.     mov si,ax            ; print error message for code AX
  51.         add si,ax
  52.         mov dx,errmsgtbl[si]
  53.         mov ah,9
  54.         int 21h
  55.         mov ax,4cffh
  56.         int 21h
  57.  
  58. @@startf0:
  59.     xor ax,ax            ; check low memory and allocate low
  60.     mov cx,ss            ;  buffer needed for protected mode
  61.     add cx,STACKLEN
  62.         movzx edx,word ptr es:[2]
  63.         sub dx,cx
  64.         cmp dx,bx
  65.         jb @@startf1
  66.         mov es,cx
  67.  
  68.     movzx ecx,cx            ; calculate base and size of free low
  69.     shl ecx,4            ;  memory and push to stack
  70.         push ecx
  71.         sub dx,bx
  72.         shl edx,4
  73.         push edx
  74.  
  75.     call _pm_init            ; enter protected mode
  76.     jc @@startf1            ; if error, go to error message
  77.  
  78.     mov cx,1            ; allocate 1 descriptor
  79.         xor ax,ax
  80.         int 31h
  81.  
  82.     mov bx,ax            ; BX = descriptor allocated
  83.  
  84.         mov dx,0ffffh                   ; set size to 4G
  85.         mov cx,dx
  86.         mov ax,8
  87.         int 31h
  88.  
  89.     mov edx,_TEXT            ; base address = 32bit code segment
  90.         shl edx,4
  91.         shld ecx,edx,16
  92.         mov ax,7
  93.         int 31h
  94.  
  95.     mov ax,cs            ; set descriptor type to 32bit code
  96.     lar cx,ax            ;  at the current CPL
  97.         mov cl,ch
  98.         mov ch,0c0h
  99.         mov ax,9
  100.         int 31h
  101.  
  102.     mov bp,bx            ; preserve selector
  103.  
  104.     mov bx,ds            ; BX = current data selector
  105.  
  106.         mov dx,0ffffh                   ; set size to 4G
  107.         mov cx,dx
  108.         mov ax,8
  109.         int 31h
  110.  
  111.     mov edx,DGROUP            ; base address = 32bit data segment
  112.         shl edx,4
  113.         shld ecx,edx,16
  114.         mov ax,7
  115.         int 31h
  116.  
  117.         cli                             ; we don't want to be interrupted
  118.                     ;  while changing SS:ESP
  119.     mov ds,bx            ; set all segment registers to data
  120.     mov es,bx            ;  selector
  121.         mov fs,bx
  122.         mov gs,bx
  123.         mov ss,bx
  124.  
  125. assume  ds:DGROUP
  126.  
  127.     mov eax,EXE_STACK        ; adjust ESP for new base of stack
  128.         mov ebx,DGROUP
  129.         sub eax,ebx
  130.         shl eax,4
  131.         add esp,eax
  132.  
  133.         sti
  134.  
  135.     mov _lowbase,edx        ; base address of 32bit data segment
  136.     pop _lowheaplen         ; relative base of free low memory
  137.     pop _lowheapbase        ; size of free low memory
  138.  
  139.     push ebp            ; push target CS:EIP in 32bit code
  140.         db 66h,68h
  141.         dd offset start32
  142.  
  143.     db 66h                ; 32bit RETF to 32bit code
  144.         retf
  145.  
  146. PMODE_TEXT      ends
  147.  
  148. extrn   _PMmain:near
  149.  
  150. _TEXT           segment byte public use32 'CODE'
  151. assume  cs:_TEXT
  152.  
  153. ;═════════════════════════════════════════════════════════════════════════════
  154. start32:
  155.     call _PMmain            ; call C code
  156.  
  157.     mov ah,4ch            ; exit to DOS
  158.         int 21h
  159.  
  160. _TEXT           ends
  161.  
  162. public  _lowbase, _lowheapbase, _lowheaplen
  163.  
  164. _BSS            segment dword public use32 'BSS'
  165.  
  166. _lowbase    dd    ?        ; base address of 32bit data segment
  167. _lowheapbase    dd    ?        ; relative base of free low memory
  168. _lowheaplen    dd    ?        ; size of free low memory
  169.  
  170. _BSS            ends
  171.  
  172. EXE_STACK       segment para stack use16 'STACK'
  173.                 db      STACKLEN dup(?)
  174. EXE_STACK       ends
  175.  
  176. end     start
  177.  
  178.